package com.example.administrator.kotlintutorial.lambda

/**
Created by chensuilun on 2019/2/21.
 */
// 最终产物 ，根据参数个数 x，生成实现 FunctionX 接口的目标函数, 开始 lambda 函数的参数默认最多 22 个，后面增加了 FunctionN 接口，使得参数可以无上限
//
//public final class LambdaTestKt {
//    @NotNull
//    private static final Function2<String, String, Unit> echo = LambdaTestKt$echo$1.INSTANCE;
//
//    @NotNull
//    public static final Function2<String, String, Unit> getEcho() {
//        return echo;
//    }
//
//    public static final void main() {
//        echo.invoke("Hello", "Lambda");
//        echo.invoke("Hello", "Lambda");
//    }
//}
//
//final class LambdaTestKt$echo$1 extends Lambda implements Function2<String, String, Unit> {
//    public static final LambdaTestKt$echo$1 INSTANCE = new LambdaTestKt$echo$1();
//
//    LambdaTestKt$echo$1() {
//        super(2);
//    }
//
//    public final void invoke(@NotNull String name, @NotNull String value) {
//        .....
//        System.out.print(stringBuilder.toString());
//    }
//}


val echo = { name: String, value: String ->
    println("Name:$name,Value:$value")
}

//产物
//
//final class LambdaTestKt$add$1 extends Lambda implements Function2<Integer, Integer, Integer> {
//    public static final LambdaTestKt$add$1 INSTANCE = new LambdaTestKt$add$1();
//
//    LambdaTestKt$add$1() {
//        super(2);
//    }
//
//    public final int invoke(int a, int b) {
//        return a + b;
//    }
//}
val add = { a: Int, b: Int ->
    a + b
}

//final class LambdaTestKt$bound$1 extends Lambda implements FunctionN<Unit> {
//    public static final LambdaTestKt$bound$1 INSTANCE = new LambdaTestKt$bound$1();
//
//    LambdaTestKt$bound$1() {
//        super(25);
//    }
//
//    public /* bridge */ /* synthetic */ Object invoke(Object[] objArr) {
//        Object[] objArr2 = objArr;
//        if (objArr2.length != 25) {
//            Intrinsics.throwIllegalArgument("Vararg argument must contain 25 elements.");
//        }
//        invoke(((Number) objArr2[0]).intValue(), ((Number) objArr2[1]).intValue(), ((Number) objArr2[2]).intValue(), ((Number) objArr2[3]).intValue(), ((Number) objArr2[4]).intValue(), ((Number) objArr2[5]).intValue(), ((Number) objArr2[6]).intValue(), ((Number) objArr2[7]).intValue(), ((Number) objArr2[8]).intValue(), ((Number) objArr2[9]).intValue(), ((Number) objArr2[10]).intValue(), ((Number) objArr2[11]).intValue(), ((Number) objArr2[12]).intValue(), ((Number) objArr2[13]).intValue(), ((Number) objArr2[14]).intValue(), ((Number) objArr2[15]).intValue(), ((Number) objArr2[16]).intValue(), ((Number) objArr2[17]).intValue(), ((Number) objArr2[18]).intValue(), ((Number) objArr2[19]).intValue(), ((Number) objArr2[20]).intValue(), ((Number) objArr2[21]).intValue(), ((Number) objArr2[22]).intValue(), ((Number) objArr2[23]).intValue(), ((Number) objArr2[24]).intValue());
//        return Unit.INSTANCE;
//    }
//
//    public final void invoke(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p, int q, int r, int s, int t, int u, int v, int w, int x, int y) {
//        System.out.println("It's Ok.");
//    }
//}
val bound = { a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int, h: Int,
              i: Int, j: Int, k: Int, l: Int, m: Int, n: Int, o: Int, p: Int,
              q: Int, r: Int, s: Int, t: Int, u: Int, v: Int, w: Int, x: Int, y: Int ->
    println("It's Ok.")
}

fun main() {
    echo("Hello", "Lambda")
    println(add(1, 2))
    bound(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
}

